package pl.net.bluesoft.rnd.processtool.ui.admin; import com.vaadin.Application; import com.vaadin.ui.AbstractSelect.Filtering; import com.vaadin.ui.*; import com.vaadin.ui.Button.ClickEvent; import com.vaadin.ui.Button.ClickListener; import org.hibernate.Criteria; import org.hibernate.criterion.DetachedCriteria; import org.hibernate.criterion.MatchMode; import org.hibernate.criterion.Order; import org.hibernate.criterion.Restrictions; import pl.net.bluesoft.rnd.processtool.ProcessToolContext; import pl.net.bluesoft.rnd.processtool.bpm.ProcessToolBpmSession; import pl.net.bluesoft.rnd.processtool.hibernate.CriteriaConfigurer; import pl.net.bluesoft.rnd.processtool.model.UserData; import pl.net.bluesoft.rnd.processtool.service.ProcessToolUserService; import pl.net.bluesoft.rnd.util.i18n.I18NSource; import org.aperteworkflow.util.vaadin.VaadinUtility; import java.util.Iterator; import java.util.List; import java.util.logging.Logger; import static pl.net.bluesoft.util.lang.Strings.hasText; public class UserSearchForm extends VerticalLayout { private Application application = null; private AdminTaskTableItem taskTableItem = null; private ProcessToolBpmSession bpmSession; private I18NSource i18N; private Logger logger = Logger.getLogger(UserSearchForm.class.getName()); private TextField emailField = new TextField(); private TextField nameField = new TextField(); private TextField surnameField = new TextField(); private TextField mpkIdField = new TextField(); private TextField companyIdField = new TextField(); private Select users = new Select(); private AdminMainPane adminMainPane; private static final String FIELD_WIDTH = "150px"; public UserSearchForm(Application app, ProcessToolBpmSession session, I18NSource i18NSource, AdminTaskTableItem item, AdminMainPane amp) { application = app; bpmSession = session; taskTableItem = item; i18N = i18NSource; adminMainPane = amp; //setCaption(getMessage("admin.selectUser")); setSpacing(true); HorizontalLayout hLay = new HorizontalLayout(); emailField.setCaption(getMessage("admin.email")); emailField.setWidth(FIELD_WIDTH); hLay.addComponent(emailField); nameField.setCaption(getMessage("admin.name")); nameField.setWidth(FIELD_WIDTH); hLay.addComponent(nameField); surnameField.setCaption(getMessage("admin.surname")); surnameField.setWidth(FIELD_WIDTH); hLay.addComponent(surnameField); mpkIdField.setCaption(getMessage("admin.mpkId")); mpkIdField.setWidth(FIELD_WIDTH); hLay.addComponent(mpkIdField); companyIdField.setCaption(getMessage("admin.companyId")); companyIdField.setWidth(FIELD_WIDTH); hLay.addComponent(companyIdField); hLay.setSpacing(true); addComponent(hLay); Button searchBtn = VaadinUtility.button(getMessage("admin.assign.search"), null, null); searchBtn.addListener(new ClickListener() { @Override public void buttonClick(ClickEvent event) { refreshUserSelect(); } }); addComponent(searchBtn); refreshUserSelect(); addComponent(users); Button assignBtn = VaadinUtility.button(getMessage("admin.assign.assign"), null, null); assignBtn.addListener(new ClickListener() { @Override public void buttonClick(ClickEvent event) { UserData ud = (UserData) users.getValue(); if (ud == null) { application.getMainWindow().showNotification(getMessage("admin.selectUser")); return; } ProcessToolContext ctx = ProcessToolContext.Util.getThreadProcessToolContext(); bpmSession.assignTaskToUser(ctx, taskTableItem.getId(), ud.getLogin()); application.getMainWindow().showNotification(getMessage("admin.assign.performed")); adminMainPane.closeModalWindow(); } }); addComponent(assignBtn); } private String getMessage(String key) { return i18N.getMessage(key); } private void refreshUserSelect() { users.removeAllItems(); ProcessToolContext ctx = ProcessToolContext.Util.getThreadProcessToolContext(); ProcessToolUserService srv = ctx.getRegistry().getRegisteredService(ProcessToolUserService.class); List<UserData> tetaUsers = srv.findUsersByCriteria(getCriteriaConfigurer( (String) emailField.getValue(), (String) nameField.getValue(), (String) surnameField.getValue(), (String) companyIdField.getValue(), (String) mpkIdField.getValue())); users.setNullSelectionAllowed(false); users.setFilteringMode(Filtering.FILTERINGMODE_CONTAINS); users.setImmediate(true); users.setWidth("100%"); List<UserData> liferayUsers = ctx.getUserDataDAO().findAll(); for (UserData ud : tetaUsers) { String login; if ((login = isEmailOnList(liferayUsers, ud.getEmail())) != null) { if (!existInUserCombo(login)) { ud.setLogin(login); users.addItem(ud); users.setItemCaption(ud, ud.getLogin() + " - " + ud.getEmail()); } } } } private CriteriaConfigurer getCriteriaConfigurer(final String email, final String name, final String surname, final String companyId, final String mpkId) { return new CriteriaConfigurer() { @Override public void configure(DetachedCriteria criteria) { if (hasText(email)) { criteria.add(Restrictions.ilike("email", email, MatchMode.ANYWHERE)); } if (hasText(name)) { criteria.add(Restrictions.ilike("name", name, MatchMode.ANYWHERE)); } if (hasText(surname)) { criteria.add(Restrictions.ilike("surname", surname, MatchMode.ANYWHERE)); } if (hasText(companyId)) { criteria.createCriteria("attributes") .add(Restrictions.eq("key", "teta_company")) .add(Restrictions.ilike("value", companyId, MatchMode.ANYWHERE)); } // to trochę nie ma sensu: musimy zrobić multijoina po atrybutach else if (hasText(mpkId)) { criteria.createCriteria("attributes") .add(Restrictions.eq("key", "teta_mpk")) .add(Restrictions.ilike("value", mpkId, MatchMode.ANYWHERE)); } criteria.addOrder(Order.asc("login")); criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY); } }; } private String isEmailOnList(List<UserData> users, String email) { if (email == null) { return null; } for (UserData ud : users) { if (email.equals(ud.getEmail())) { return ud.getLogin(); } } return null; } private boolean existInUserCombo(String login) { Iterator i = users.getItemIds().iterator(); while (i.hasNext()) { UserData ud = (UserData) i.next(); if (login.equals(ud.getLogin())) { return true; } } return false; } }